| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352 | 1
1
1
1
1
1
1
1
3
1
1
1
1
1
1
1
1
1
1
1
1
1
| System.register(['./resource-registry', './view-factory', './binding-language'], function (_export) {
'use strict';
var ResourceRegistry, ViewFactory, BindingLanguage, nextInjectorId, defaultCompileOptions, hasShadowDOM, needsTemplateFixup, ViewCompiler;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function getNextInjectorId() {
return ++nextInjectorId;
}
function configureProperties(instruction, resources) {
var type = instruction.type,
attrName = instruction.attrName,
attributes = instruction.attributes,
property,
key,
value;
var knownAttribute = resources.mapAttribute(attrName);
if (knownAttribute && attrName in attributes && knownAttribute !== attrName) {
attributes[knownAttribute] = attributes[attrName];
delete attributes[attrName];
}
for (key in attributes) {
value = attributes[key];
if (typeof value !== 'string') {
property = type.attributes[key];
if (property !== undefined) {
value.targetProperty = property.name;
} else {
value.targetProperty = key;
}
}
}
}
function makeIntoInstructionTarget(element) {
var value = element.getAttribute('class');
element.setAttribute('class', value ? value += ' au-target' : 'au-target');
}
return {
setters: [function (_resourceRegistry) {
ResourceRegistry = _resourceRegistry.ResourceRegistry;
}, function (_viewFactory) {
ViewFactory = _viewFactory.ViewFactory;
}, function (_bindingLanguage) {
BindingLanguage = _bindingLanguage.BindingLanguage;
}],
execute: function () {
nextInjectorId = 0;
defaultCompileOptions = { targetShadowDOM: false };
hasShadowDOM = !!HTMLElement.prototype.createShadowRoot;
needsTemplateFixup = !('content' in document.createElement('template'));
ViewCompiler = (function () {
function ViewCompiler(bindingLanguage) {
_classCallCheck(this, ViewCompiler);
this.bindingLanguage = bindingLanguage;
}
ViewCompiler.inject = function inject() {
return [BindingLanguage];
};
ViewCompiler.prototype.compile = function compile(templateOrFragment, resources) {
var options = arguments[2] === undefined ? defaultCompileOptions : arguments[2];
var instructions = [],
targetShadowDOM = options.targetShadowDOM,
content,
part,
factory,
temp;
targetShadowDOM = targetShadowDOM && hasShadowDOM;
if (options.beforeCompile) {
options.beforeCompile(templateOrFragment);
}
if (typeof templateOrFragment === 'string') {
temp = document.createElement('template');
temp.innerHTML = templateOrFragment;
if (needsTemplateFixup) {
temp.content = document.createDocumentFragment();
while (temp.firstChild) {
temp.content.appendChild(temp.firstChild);
}
}
templateOrFragment = temp;
}
if (templateOrFragment.content) {
part = templateOrFragment.getAttribute('part');
content = document.adoptNode(templateOrFragment.content, true);
//TODO: read in element instructions
} else {
content = templateOrFragment;
}
this.compileNode(content, resources, instructions, templateOrFragment, 'root', !targetShadowDOM);
content.insertBefore(document.createComment('<view>'), content.firstChild);
content.appendChild(document.createComment('</view>'));
var factory = new ViewFactory(content, instructions, resources);
if (part) {
factory.part = part;
}
return factory;
};
ViewCompiler.prototype.compileNode = function compileNode(node, resources, instructions, parentNode, parentInjectorId, targetLightDOM) {
switch (node.nodeType) {
case 1:
//element node
return this.compileElement(node, resources, instructions, parentNode, parentInjectorId, targetLightDOM);
case 3:
//text node
var expression = this.bindingLanguage.parseText(resources, node.textContent);
if (expression) {
var marker = document.createElement('au-marker');
marker.className = 'au-target';
(node.parentNode || parentNode).insertBefore(marker, node);
node.textContent = ' ';
instructions.push({ contentExpression: expression });
}
return node.nextSibling;
case 11:
//document fragment node
var currentChild = node.firstChild;
while (currentChild) {
currentChild = this.compileNode(currentChild, resources, instructions, node, parentInjectorId, targetLightDOM);
}
break;
}
return node.nextSibling;
};
ViewCompiler.prototype.compileElement = function compileElement(node, resources, instructions, parentNode, parentInjectorId, targetLightDOM) {
var tagName = node.tagName.toLowerCase(),
attributes = node.attributes,
expressions = [],
behaviorInstructions = [],
providers = [],
bindingLanguage = this.bindingLanguage,
liftingInstruction,
viewFactory,
type,
elementInstruction,
elementProperty,
i,
ii,
attr,
attrName,
attrValue,
instruction,
info,
property,
knownAttribute;
if (tagName === 'content') {
if (targetLightDOM) {
instructions.push({
parentInjectorId: parentInjectorId,
contentSelector: true,
selector: node.getAttribute('select'),
suppressBind: true
});
makeIntoInstructionTarget(node);
}
return node.nextSibling;
} else if (tagName === 'template') {
viewFactory = this.compile(node, resources);
viewFactory.part = node.getAttribute('part');
} else {
type = resources.getElement(tagName);
if (type) {
elementInstruction = { type: type, attributes: {} };
elementInstruction.anchorIsContainer = !node.hasAttribute('containerless') && !type.containerless;
behaviorInstructions.push(elementInstruction);
}
}
for (i = 0, ii = attributes.length; i < ii; ++i) {
attr = attributes[i];
attrName = attr.name;
attrValue = attr.value;
info = bindingLanguage.inspectAttribute(resources, attrName, attrValue);
type = resources.getAttribute(info.attrName);
elementProperty = null;
if (type) {
//do we have an attached behavior?
knownAttribute = resources.mapAttribute(info.attrName); //map the local name to real name
if (knownAttribute) {
property = type.attributes[knownAttribute];
if (property) {
//if there's a defined property
info.defaultBindingMode = property.defaultBindingMode; //set the default binding mode
if (!info.command && !info.expression) {
// if there is no command or detected expression
info.command = property.hasOptions ? 'options' : null; //and it is an optons property, set the options command
}
}
}
} else if (elementInstruction) {
//or if this is on a custom element
elementProperty = elementInstruction.type.attributes[info.attrName];
if (elementProperty) {
//and this attribute is a custom property
info.defaultBindingMode = elementProperty.defaultBindingMode; //set the default binding mode
if (!info.command && !info.expression) {
// if there is no command or detected expression
info.command = elementProperty.hasOptions ? 'options' : null; //and it is an optons property, set the options command
}
}
}
if (elementProperty) {
instruction = bindingLanguage.createAttributeInstruction(resources, node, info, elementInstruction);
} else {
instruction = bindingLanguage.createAttributeInstruction(resources, node, info);
}
if (instruction) {
//HAS BINDINGS
if (instruction.alteredAttr) {
type = resources.getAttribute(instruction.attrName);
}
if (instruction.discrete) {
//ref binding or listener binding
expressions.push(instruction);
} else {
//attribute bindings
if (type) {
//templator or attached behavior found
instruction.type = type;
configureProperties(instruction, resources);
if (type.liftsContent) {
//template controller
instruction.originalAttrName = attrName;
liftingInstruction = instruction;
break;
} else {
//attached behavior
behaviorInstructions.push(instruction);
}
} else if (elementProperty) {
//custom element attribute
elementInstruction.attributes[info.attrName].targetProperty = elementProperty.name;
} else {
//standard attribute binding
expressions.push(instruction.attributes[instruction.attrName]);
}
}
} else {
//NO BINDINGS
if (type) {
//templator or attached behavior found
instruction = { attrName: attrName, type: type, attributes: {} };
instruction.attributes[resources.mapAttribute(attrName)] = attrValue;
if (type.liftsContent) {
//template controller
instruction.originalAttrName = attrName;
liftingInstruction = instruction;
break;
} else {
//attached behavior
behaviorInstructions.push(instruction);
}
} else if (elementProperty) {
//custom element attribute
elementInstruction.attributes[attrName] = attrValue;
}
//else; normal attribute; do nothing
}
}
if (liftingInstruction) {
liftingInstruction.viewFactory = viewFactory;
node = liftingInstruction.type.compile(this, resources, node, liftingInstruction, parentNode);
makeIntoInstructionTarget(node);
instructions.push({
anchorIsContainer: false,
parentInjectorId: parentInjectorId,
expressions: [],
behaviorInstructions: [liftingInstruction],
viewFactory: liftingInstruction.viewFactory,
providers: [liftingInstruction.type.target]
});
} else {
for (i = 0, ii = behaviorInstructions.length; i < ii; ++i) {
instruction = behaviorInstructions[i];
instruction.type.compile(this, resources, node, instruction, parentNode);
providers.push(instruction.type.target);
}
var injectorId = behaviorInstructions.length ? getNextInjectorId() : false;
if (expressions.length || behaviorInstructions.length) {
makeIntoInstructionTarget(node);
instructions.push({
anchorIsContainer: elementInstruction ? elementInstruction.anchorIsContainer : true,
isCustomElement: !!elementInstruction,
injectorId: injectorId,
parentInjectorId: parentInjectorId,
expressions: expressions,
behaviorInstructions: behaviorInstructions,
providers: providers
});
}
if (elementInstruction && elementInstruction.type.skipContentProcessing) {
return node.nextSibling;
}
var currentChild = node.firstChild;
while (currentChild) {
currentChild = this.compileNode(currentChild, resources, instructions, node, injectorId || parentInjectorId, targetLightDOM);
}
}
return node.nextSibling;
};
return ViewCompiler;
})();
_export('ViewCompiler', ViewCompiler);
}
};
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL3RlbXBsYXRpbmcvc3JjL3ZpZXctY29tcGlsZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O3NEQUlJLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIsWUFBWSxFQUNaLGtCQUFrQixFQXNDVCxZQUFZOzs7O0FBcEN6QixXQUFTLGlCQUFpQixHQUFFO0FBQzFCLFdBQU8sRUFBRSxjQUFjLENBQUM7R0FDekI7O0FBRUQsV0FBUyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFDO0FBQ2xELFFBQUksSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJO1FBQ3ZCLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUTtRQUMvQixVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVU7UUFDbkMsUUFBUTtRQUFFLEdBQUc7UUFBRSxLQUFLLENBQUM7O0FBRXpCLFFBQUksY0FBYyxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdEQsUUFBRyxjQUFjLElBQUksUUFBUSxJQUFJLFVBQVUsSUFBSSxjQUFjLEtBQUssUUFBUSxFQUFDO0FBQ3pFLGdCQUFVLENBQUMsY0FBYyxDQUFDLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2xELGFBQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQzdCOztBQUVELFNBQUksR0FBRyxJQUFJLFVBQVUsRUFBQztBQUNwQixXQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztBQUV4QixVQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBQztBQUMzQixnQkFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7O0FBRWhDLFlBQUcsUUFBUSxLQUFLLFNBQVMsRUFBQztBQUN4QixlQUFLLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7U0FDdEMsTUFBSTtBQUNILGVBQUssQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDO1NBQzVCO09BQ0Y7S0FDRjtHQUNGOztBQUVELFdBQVMseUJBQXlCLENBQUMsT0FBTyxFQUFDO0FBQ3pDLFFBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDMUMsV0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUcsS0FBSyxHQUFHLEtBQUssSUFBSSxZQUFZLEdBQUcsV0FBVyxDQUFFLENBQUM7R0FDOUU7Ozs7MkNBM0NPLGdCQUFnQjs7aUNBQ2hCLFdBQVc7O3lDQUNYLGVBQWU7OztBQUVuQixvQkFBYyxHQUFHLENBQUM7QUFDbEIsMkJBQXFCLEdBQUcsRUFBRSxlQUFlLEVBQUMsS0FBSyxFQUFFO0FBQ2pELGtCQUFZLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCO0FBQ3ZELHdCQUFrQixHQUFHLEVBQUUsU0FBUyxJQUFJLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUEsQUFBQzs7QUFzQzlELGtCQUFZO0FBRVosaUJBRkEsWUFBWSxDQUVYLGVBQWUsRUFBQztnQ0FGakIsWUFBWTs7QUFHckIsY0FBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7U0FDeEM7O0FBSlUsb0JBQVksQ0FDaEIsTUFBTSxHQUFBLGtCQUFHO0FBQUUsaUJBQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUFFOztBQURsQyxvQkFBWSxXQU12QixPQUFPLEdBQUEsaUJBQUMsa0JBQWtCLEVBQUUsU0FBUyxFQUFnQztjQUE5QixPQUFPLGdDQUFDLHFCQUFxQjs7QUFDbEUsY0FBSSxZQUFZLEdBQUcsRUFBRTtjQUNqQixlQUFlLEdBQUcsT0FBTyxDQUFDLGVBQWU7Y0FDekMsT0FBTztjQUFFLElBQUk7Y0FBRSxPQUFPO2NBQUUsSUFBSSxDQUFDOztBQUVqQyx5QkFBZSxHQUFHLGVBQWUsSUFBSSxZQUFZLENBQUM7O0FBRWxELGNBQUcsT0FBTyxDQUFDLGFBQWEsRUFBQztBQUN2QixtQkFBTyxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1dBQzNDOztBQUVELGNBQUcsT0FBTyxrQkFBa0IsS0FBSyxRQUFRLEVBQUM7QUFDeEMsZ0JBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzFDLGdCQUFJLENBQUMsU0FBUyxHQUFHLGtCQUFrQixDQUFDOztBQUVwQyxnQkFBRyxrQkFBa0IsRUFBQztBQUNwQixrQkFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztBQUNqRCxxQkFBTSxJQUFJLENBQUMsVUFBVSxFQUFDO0FBQ3BCLG9CQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7ZUFDM0M7YUFDRjs7QUFFRCw4QkFBa0IsR0FBRyxJQUFJLENBQUM7V0FDM0I7O0FBRUQsY0FBRyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUM7QUFDNUIsZ0JBQUksR0FBRyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDL0MsbUJBQU8sR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQzs7V0FFaEUsTUFBSTtBQUNILG1CQUFPLEdBQUcsa0JBQWtCLENBQUM7V0FDOUI7O0FBRUQsY0FBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQzs7QUFFakcsaUJBQU8sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDM0UsaUJBQU8sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDOztBQUV2RCxjQUFJLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDOztBQUVoRSxjQUFHLElBQUksRUFBQztBQUNOLG1CQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztXQUNyQjs7QUFFRCxpQkFBTyxPQUFPLENBQUM7U0FDaEI7O0FBbkRVLG9CQUFZLFdBcUR2QixXQUFXLEdBQUEscUJBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBQztBQUN0RixrQkFBTyxJQUFJLENBQUMsUUFBUTtBQUNsQixpQkFBSyxDQUFDOztBQUNKLHFCQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQUEsQUFDMUcsaUJBQUssQ0FBQzs7QUFDSixrQkFBSSxVQUFVLEdBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM5RSxrQkFBRyxVQUFVLEVBQUM7QUFDWixvQkFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNqRCxzQkFBTSxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUM7QUFDL0IsaUJBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUEsQ0FBRSxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNELG9CQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztBQUN2Qiw0QkFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLGlCQUFpQixFQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7ZUFDckQ7QUFDRCxxQkFBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0FBQUEsQUFDMUIsaUJBQUssRUFBRTs7QUFDTCxrQkFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztBQUNuQyxxQkFBTyxZQUFZLEVBQUU7QUFDbkIsNEJBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsQ0FBQztlQUNoSDtBQUNELG9CQUFNO0FBQUEsV0FDVDs7QUFFRCxpQkFBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1NBQ3pCOztBQTVFVSxvQkFBWSxXQThFdkIsY0FBYyxHQUFBLHdCQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUM7QUFDekYsY0FBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUU7Y0FDcEMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVO2NBQzVCLFdBQVcsR0FBRyxFQUFFO2NBQ2hCLG9CQUFvQixHQUFHLEVBQUU7Y0FDekIsU0FBUyxHQUFHLEVBQUU7Y0FDZCxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWU7Y0FDdEMsa0JBQWtCO2NBQUUsV0FBVztjQUFFLElBQUk7Y0FBRSxrQkFBa0I7Y0FDekQsZUFBZTtjQUFFLENBQUM7Y0FBRSxFQUFFO2NBQUUsSUFBSTtjQUFFLFFBQVE7Y0FBRSxTQUFTO2NBQUUsV0FBVztjQUFFLElBQUk7Y0FDcEUsUUFBUTtjQUFFLGNBQWMsQ0FBQzs7QUFFN0IsY0FBRyxPQUFPLEtBQUssU0FBUyxFQUFDO0FBQ3ZCLGdCQUFHLGNBQWMsRUFBQztBQUNoQiwwQkFBWSxDQUFDLElBQUksQ0FBQztBQUNoQixnQ0FBZ0IsRUFBRSxnQkFBZ0I7QUFDbEMsK0JBQWUsRUFBRSxJQUFJO0FBQ3JCLHdCQUFRLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7QUFDcEMsNEJBQVksRUFBRSxJQUFJO2VBQ25CLENBQUMsQ0FBQztBQUNILHVDQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2pDO0FBQ0QsbUJBQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztXQUN6QixNQUFNLElBQUcsT0FBTyxLQUFLLFVBQVUsRUFBQztBQUMvQix1QkFBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzVDLHVCQUFXLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7V0FDOUMsTUFBSztBQUNKLGdCQUFJLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNyQyxnQkFBRyxJQUFJLEVBQUM7QUFDTixnQ0FBa0IsR0FBRyxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFDLEVBQUUsRUFBQyxDQUFDO0FBQ2hELGdDQUFrQixDQUFDLGlCQUFpQixHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7QUFDbEcsa0NBQW9CLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDL0M7V0FDRjs7QUFFRCxlQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBQztBQUM3QyxnQkFBSSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixvQkFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDckIscUJBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ3ZCLGdCQUFJLEdBQUcsZUFBZSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDeEUsZ0JBQUksR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM3QywyQkFBZSxHQUFHLElBQUksQ0FBQzs7QUFFdkIsZ0JBQUcsSUFBSSxFQUFDOztBQUNOLDRCQUFjLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdkQsa0JBQUcsY0FBYyxFQUFDO0FBQ2hCLHdCQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQzs7QUFFM0Msb0JBQUcsUUFBUSxFQUFDOztBQUNWLHNCQUFJLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDOztBQUV0RCxzQkFBRyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFDOztBQUNuQyx3QkFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsVUFBVSxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUM7bUJBQ3ZEO2lCQUNGO2VBQ0Y7YUFDRixNQUFLLElBQUcsa0JBQWtCLEVBQUM7O0FBQzFCLDZCQUFlLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDcEUsa0JBQUcsZUFBZSxFQUFDOztBQUNqQixvQkFBSSxDQUFDLGtCQUFrQixHQUFHLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQzs7QUFFN0Qsb0JBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBQzs7QUFDbkMsc0JBQUksQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDLFVBQVUsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDO2lCQUM5RDtlQUNGO2FBQ0Y7O0FBRUQsZ0JBQUcsZUFBZSxFQUFDO0FBQ2pCLHlCQUFXLEdBQUcsZUFBZSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixDQUFDLENBQUM7YUFDckcsTUFBSTtBQUNILHlCQUFXLEdBQUcsZUFBZSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDakY7O0FBRUQsZ0JBQUcsV0FBVyxFQUFDOztBQUNiLGtCQUFHLFdBQVcsQ0FBQyxXQUFXLEVBQUM7QUFDekIsb0JBQUksR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztlQUNyRDs7QUFFRCxrQkFBRyxXQUFXLENBQUMsUUFBUSxFQUFDOztBQUN0QiwyQkFBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztlQUMvQixNQUFJOztBQUNILG9CQUFHLElBQUksRUFBQzs7QUFDTiw2QkFBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDeEIscUNBQW1CLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDOztBQUU1QyxzQkFBRyxJQUFJLENBQUMsWUFBWSxFQUFDOztBQUNuQiwrQkFBVyxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztBQUN4QyxzQ0FBa0IsR0FBRyxXQUFXLENBQUM7QUFDakMsMEJBQU07bUJBQ1AsTUFBSTs7QUFDSCx3Q0FBb0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7bUJBQ3hDO2lCQUNGLE1BQUssSUFBRyxlQUFlLEVBQUU7O0FBQ3hCLG9DQUFrQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsY0FBYyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUM7aUJBQ3BGLE1BQUs7O0FBQ0osNkJBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztpQkFDaEU7ZUFDRjthQUNGLE1BQUk7O0FBQ0gsa0JBQUcsSUFBSSxFQUFDOztBQUNOLDJCQUFXLEdBQUcsRUFBRSxRQUFRLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFDLEVBQUUsRUFBRSxDQUFDO0FBQzlELDJCQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7O0FBRXJFLG9CQUFHLElBQUksQ0FBQyxZQUFZLEVBQUM7O0FBQ25CLDZCQUFXLENBQUMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLG9DQUFrQixHQUFHLFdBQVcsQ0FBQztBQUNqQyx3QkFBTTtpQkFDUCxNQUFJOztBQUNILHNDQUFvQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDeEM7ZUFDRixNQUFLLElBQUcsZUFBZSxFQUFDOztBQUN2QixrQ0FBa0IsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsU0FBUyxDQUFDO2VBQ3JEOzs7QUFBQSxhQUdGO1dBQ0Y7O0FBRUQsY0FBRyxrQkFBa0IsRUFBQztBQUNwQiw4QkFBa0IsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0FBQzdDLGdCQUFJLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUM5RixxQ0FBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyx3QkFBWSxDQUFDLElBQUksQ0FBQztBQUNoQiwrQkFBaUIsRUFBRSxLQUFLO0FBQ3hCLDhCQUFnQixFQUFFLGdCQUFnQjtBQUNsQyx5QkFBVyxFQUFFLEVBQUU7QUFDZixrQ0FBb0IsRUFBRSxDQUFDLGtCQUFrQixDQUFDO0FBQzFDLHlCQUFXLEVBQUUsa0JBQWtCLENBQUMsV0FBVztBQUMzQyx1QkFBUyxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUM1QyxDQUFDLENBQUM7V0FDSixNQUFJO0FBQ0gsaUJBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUM7QUFDdkQseUJBQVcsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0Qyx5QkFBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3pFLHVCQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDekM7O0FBRUQsZ0JBQUksVUFBVSxHQUFHLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxpQkFBaUIsRUFBRSxHQUFHLEtBQUssQ0FBQzs7QUFFM0UsZ0JBQUcsV0FBVyxDQUFDLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLEVBQUM7QUFDbkQsdUNBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsMEJBQVksQ0FBQyxJQUFJLENBQUM7QUFDaEIsaUNBQWlCLEVBQUUsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUMsaUJBQWlCLEdBQUcsSUFBSTtBQUNuRiwrQkFBZSxFQUFFLENBQUMsQ0FBQyxrQkFBa0I7QUFDckMsMEJBQVUsRUFBRSxVQUFVO0FBQ3RCLGdDQUFnQixFQUFFLGdCQUFnQjtBQUNsQywyQkFBVyxFQUFFLFdBQVc7QUFDeEIsb0NBQW9CLEVBQUUsb0JBQW9CO0FBQzFDLHlCQUFTLEVBQUUsU0FBUztlQUNyQixDQUFDLENBQUM7YUFDSjs7QUFFRCxnQkFBRyxrQkFBa0IsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUM7QUFDckUscUJBQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQzthQUN6Qjs7QUFFRCxnQkFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztBQUNuQyxtQkFBTyxZQUFZLEVBQUU7QUFDbkIsMEJBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxVQUFVLElBQUksZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUM7YUFDOUg7V0FDRjs7QUFFRCxpQkFBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1NBQ3pCOztlQWhQVSxZQUFZOzs7OEJBQVosWUFBWSIsImZpbGUiOiIvVXNlcnMvRWlzZW5iZXJnRWZmZWN0L0RvY3VtZW50cy9HaXRIdWIvVGhlIER1cmFuZGFsIFByb2plY3QvYXVyZWxpYS90ZW1wbGF0aW5nL3NyYy92aWV3LWNvbXBpbGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtSZXNvdXJjZVJlZ2lzdHJ5fSBmcm9tICcuL3Jlc291cmNlLXJlZ2lzdHJ5JztcbmltcG9ydCB7Vmlld0ZhY3Rvcnl9IGZyb20gJy4vdmlldy1mYWN0b3J5JztcbmltcG9ydCB7QmluZGluZ0xhbmd1YWdlfSBmcm9tICcuL2JpbmRpbmctbGFuZ3VhZ2UnO1xuXG52YXIgbmV4dEluamVjdG9ySWQgPSAwLFxuICAgIGRlZmF1bHRDb21waWxlT3B0aW9ucyA9IHsgdGFyZ2V0U2hhZG93RE9NOmZhbHNlIH0sXG4gICAgaGFzU2hhZG93RE9NID0gISFIVE1MRWxlbWVudC5wcm90b3R5cGUuY3JlYXRlU2hhZG93Um9vdCxcbiAgICBuZWVkc1RlbXBsYXRlRml4dXAgPSAhKCdjb250ZW50JyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpKTtcblxuZnVuY3Rpb24gZ2V0TmV4dEluamVjdG9ySWQoKXtcbiAgcmV0dXJuICsrbmV4dEluamVjdG9ySWQ7XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZVByb3BlcnRpZXMoaW5zdHJ1Y3Rpb24sIHJlc291cmNlcyl7XG4gIHZhciB0eXBlID0gaW5zdHJ1Y3Rpb24udHlwZSxcbiAgICAgIGF0dHJOYW1lID0gaW5zdHJ1Y3Rpb24uYXR0ck5hbWUsXG4gICAgICBhdHRyaWJ1dGVzID0gaW5zdHJ1Y3Rpb24uYXR0cmlidXRlcyxcbiAgICAgIHByb3BlcnR5LCBrZXksIHZhbHVlO1xuXG4gIHZhciBrbm93bkF0dHJpYnV0ZSA9IHJlc291cmNlcy5tYXBBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICBpZihrbm93bkF0dHJpYnV0ZSAmJiBhdHRyTmFtZSBpbiBhdHRyaWJ1dGVzICYmIGtub3duQXR0cmlidXRlICE9PSBhdHRyTmFtZSl7XG4gICAgYXR0cmlidXRlc1trbm93bkF0dHJpYnV0ZV0gPSBhdHRyaWJ1dGVzW2F0dHJOYW1lXTtcbiAgICBkZWxldGUgYXR0cmlidXRlc1thdHRyTmFtZV07XG4gIH1cblxuICBmb3Ioa2V5IGluIGF0dHJpYnV0ZXMpe1xuICAgIHZhbHVlID0gYXR0cmlidXRlc1trZXldO1xuXG4gICAgaWYodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyl7XG4gICAgICBwcm9wZXJ0eSA9IHR5cGUuYXR0cmlidXRlc1trZXldO1xuXG4gICAgICBpZihwcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKXtcbiAgICAgICAgdmFsdWUudGFyZ2V0UHJvcGVydHkgPSBwcm9wZXJ0eS5uYW1lO1xuICAgICAgfWVsc2V7XG4gICAgICAgIHZhbHVlLnRhcmdldFByb3BlcnR5ID0ga2V5O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYWtlSW50b0luc3RydWN0aW9uVGFyZ2V0KGVsZW1lbnQpe1xuICB2YXIgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnY2xhc3MnKTtcbiAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgKHZhbHVlID8gdmFsdWUgKz0gJyBhdS10YXJnZXQnIDogJ2F1LXRhcmdldCcpKTtcbn1cblxuZXhwb3J0IGNsYXNzIFZpZXdDb21waWxlciB7XG4gIHN0YXRpYyBpbmplY3QoKSB7IHJldHVybiBbQmluZGluZ0xhbmd1YWdlXTsgfVxuICBjb25zdHJ1Y3RvcihiaW5kaW5nTGFuZ3VhZ2Upe1xuICAgIHRoaXMuYmluZGluZ0xhbmd1YWdlID0gYmluZGluZ0xhbmd1YWdlO1xuICB9XG5cbiAgY29tcGlsZSh0ZW1wbGF0ZU9yRnJhZ21lbnQsIHJlc291cmNlcywgb3B0aW9ucz1kZWZhdWx0Q29tcGlsZU9wdGlvbnMpe1xuICAgIHZhciBpbnN0cnVjdGlvbnMgPSBbXSxcbiAgICAgICAgdGFyZ2V0U2hhZG93RE9NID0gb3B0aW9ucy50YXJnZXRTaGFkb3dET00sXG4gICAgICAgIGNvbnRlbnQsIHBhcnQsIGZhY3RvcnksIHRlbXA7XG5cbiAgICB0YXJnZXRTaGFkb3dET00gPSB0YXJnZXRTaGFkb3dET00gJiYgaGFzU2hhZG93RE9NO1xuXG4gICAgaWYob3B0aW9ucy5iZWZvcmVDb21waWxlKXtcbiAgICAgIG9wdGlvbnMuYmVmb3JlQ29tcGlsZSh0ZW1wbGF0ZU9yRnJhZ21lbnQpO1xuICAgIH1cblxuICAgIGlmKHR5cGVvZiB0ZW1wbGF0ZU9yRnJhZ21lbnQgPT09ICdzdHJpbmcnKXtcbiAgICAgIHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgdGVtcC5pbm5lckhUTUwgPSB0ZW1wbGF0ZU9yRnJhZ21lbnQ7XG5cbiAgICAgIGlmKG5lZWRzVGVtcGxhdGVGaXh1cCl7XG4gICAgICAgIHRlbXAuY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgd2hpbGUodGVtcC5maXJzdENoaWxkKXtcbiAgICAgICAgICB0ZW1wLmNvbnRlbnQuYXBwZW5kQ2hpbGQodGVtcC5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0ZW1wbGF0ZU9yRnJhZ21lbnQgPSB0ZW1wO1xuICAgIH1cblxuICAgIGlmKHRlbXBsYXRlT3JGcmFnbWVudC5jb250ZW50KXtcbiAgICAgIHBhcnQgPSB0ZW1wbGF0ZU9yRnJhZ21lbnQuZ2V0QXR0cmlidXRlKCdwYXJ0Jyk7XG4gICAgICBjb250ZW50ID0gZG9jdW1lbnQuYWRvcHROb2RlKHRlbXBsYXRlT3JGcmFnbWVudC5jb250ZW50LCB0cnVlKTtcbiAgICAgIC8vVE9ETzogcmVhZCBpbiBlbGVtZW50IGluc3RydWN0aW9uc1xuICAgIH1lbHNle1xuICAgICAgY29udGVudCA9IHRlbXBsYXRlT3JGcmFnbWVudDtcbiAgICB9XG5cbiAgICB0aGlzLmNvbXBpbGVOb2RlKGNvbnRlbnQsIHJlc291cmNlcywgaW5zdHJ1Y3Rpb25zLCB0ZW1wbGF0ZU9yRnJhZ21lbnQsICdyb290JywgIXRhcmdldFNoYWRvd0RPTSk7XG5cbiAgICBjb250ZW50Lmluc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVDb21tZW50KCc8dmlldz4nKSwgY29udGVudC5maXJzdENoaWxkKTtcbiAgICBjb250ZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJzwvdmlldz4nKSk7XG5cbiAgICB2YXIgZmFjdG9yeSA9IG5ldyBWaWV3RmFjdG9yeShjb250ZW50LCBpbnN0cnVjdGlvbnMsIHJlc291cmNlcyk7XG5cbiAgICBpZihwYXJ0KXtcbiAgICAgIGZhY3RvcnkucGFydCA9IHBhcnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhY3Rvcnk7XG4gIH1cblxuICBjb21waWxlTm9kZShub2RlLCByZXNvdXJjZXMsIGluc3RydWN0aW9ucywgcGFyZW50Tm9kZSwgcGFyZW50SW5qZWN0b3JJZCwgdGFyZ2V0TGlnaHRET00pe1xuICAgIHN3aXRjaChub2RlLm5vZGVUeXBlKXtcbiAgICAgIGNhc2UgMTogLy9lbGVtZW50IG5vZGVcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZUVsZW1lbnQobm9kZSwgcmVzb3VyY2VzLCBpbnN0cnVjdGlvbnMsIHBhcmVudE5vZGUsIHBhcmVudEluamVjdG9ySWQsIHRhcmdldExpZ2h0RE9NKTtcbiAgICAgIGNhc2UgMzogLy90ZXh0IG5vZGVcbiAgICAgICAgdmFyIGV4cHJlc3Npb24gPSAgdGhpcy5iaW5kaW5nTGFuZ3VhZ2UucGFyc2VUZXh0KHJlc291cmNlcywgbm9kZS50ZXh0Q29udGVudCk7XG4gICAgICAgIGlmKGV4cHJlc3Npb24pe1xuICAgICAgICAgIHZhciBtYXJrZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhdS1tYXJrZXInKTtcbiAgICAgICAgICBtYXJrZXIuY2xhc3NOYW1lID0gJ2F1LXRhcmdldCc7XG4gICAgICAgICAgKG5vZGUucGFyZW50Tm9kZSB8fCBwYXJlbnROb2RlKS5pbnNlcnRCZWZvcmUobWFya2VyLCBub2RlKTtcbiAgICAgICAgICBub2RlLnRleHRDb250ZW50ID0gJyAnO1xuICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKHsgY29udGVudEV4cHJlc3Npb246ZXhwcmVzc2lvbiB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbiAgICAgIGNhc2UgMTE6IC8vZG9jdW1lbnQgZnJhZ21lbnQgbm9kZVxuICAgICAgICB2YXIgY3VycmVudENoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICB3aGlsZSAoY3VycmVudENoaWxkKSB7XG4gICAgICAgICAgY3VycmVudENoaWxkID0gdGhpcy5jb21waWxlTm9kZShjdXJyZW50Q2hpbGQsIHJlc291cmNlcywgaW5zdHJ1Y3Rpb25zLCBub2RlLCBwYXJlbnRJbmplY3RvcklkLCB0YXJnZXRMaWdodERPTSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG4gIH1cblxuICBjb21waWxlRWxlbWVudChub2RlLCByZXNvdXJjZXMsIGluc3RydWN0aW9ucywgcGFyZW50Tm9kZSwgcGFyZW50SW5qZWN0b3JJZCwgdGFyZ2V0TGlnaHRET00pe1xuICAgIHZhciB0YWdOYW1lID0gbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICAgIGF0dHJpYnV0ZXMgPSBub2RlLmF0dHJpYnV0ZXMsXG4gICAgICAgIGV4cHJlc3Npb25zID0gW10sXG4gICAgICAgIGJlaGF2aW9ySW5zdHJ1Y3Rpb25zID0gW10sXG4gICAgICAgIHByb3ZpZGVycyA9IFtdLFxuICAgICAgICBiaW5kaW5nTGFuZ3VhZ2UgPSB0aGlzLmJpbmRpbmdMYW5ndWFnZSxcbiAgICAgICAgbGlmdGluZ0luc3RydWN0aW9uLCB2aWV3RmFjdG9yeSwgdHlwZSwgZWxlbWVudEluc3RydWN0aW9uLFxuICAgICAgICBlbGVtZW50UHJvcGVydHksIGksIGlpLCBhdHRyLCBhdHRyTmFtZSwgYXR0clZhbHVlLCBpbnN0cnVjdGlvbiwgaW5mbyxcbiAgICAgICAgcHJvcGVydHksIGtub3duQXR0cmlidXRlO1xuXG4gICAgaWYodGFnTmFtZSA9PT0gJ2NvbnRlbnQnKXtcbiAgICAgIGlmKHRhcmdldExpZ2h0RE9NKXtcbiAgICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICAgIHBhcmVudEluamVjdG9ySWQ6IHBhcmVudEluamVjdG9ySWQsXG4gICAgICAgICAgY29udGVudFNlbGVjdG9yOiB0cnVlLFxuICAgICAgICAgIHNlbGVjdG9yOm5vZGUuZ2V0QXR0cmlidXRlKCdzZWxlY3QnKSxcbiAgICAgICAgICBzdXBwcmVzc0JpbmQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIG1ha2VJbnRvSW5zdHJ1Y3Rpb25UYXJnZXQobm9kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbiAgICB9IGVsc2UgaWYodGFnTmFtZSA9PT0gJ3RlbXBsYXRlJyl7XG4gICAgICB2aWV3RmFjdG9yeSA9IHRoaXMuY29tcGlsZShub2RlLCByZXNvdXJjZXMpO1xuICAgICAgdmlld0ZhY3RvcnkucGFydCA9IG5vZGUuZ2V0QXR0cmlidXRlKCdwYXJ0Jyk7XG4gICAgfSBlbHNle1xuICAgICAgdHlwZSA9IHJlc291cmNlcy5nZXRFbGVtZW50KHRhZ05hbWUpO1xuICAgICAgaWYodHlwZSl7XG4gICAgICAgIGVsZW1lbnRJbnN0cnVjdGlvbiA9IHt0eXBlOnR5cGUsIGF0dHJpYnV0ZXM6e319O1xuICAgICAgICBlbGVtZW50SW5zdHJ1Y3Rpb24uYW5jaG9ySXNDb250YWluZXIgPSAhbm9kZS5oYXNBdHRyaWJ1dGUoJ2NvbnRhaW5lcmxlc3MnKSAmJiAhdHlwZS5jb250YWluZXJsZXNzO1xuICAgICAgICBiZWhhdmlvckluc3RydWN0aW9ucy5wdXNoKGVsZW1lbnRJbnN0cnVjdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yKGkgPSAwLCBpaSA9IGF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgaWk7ICsraSl7XG4gICAgICBhdHRyID0gYXR0cmlidXRlc1tpXTtcbiAgICAgIGF0dHJOYW1lID0gYXR0ci5uYW1lO1xuICAgICAgYXR0clZhbHVlID0gYXR0ci52YWx1ZTtcbiAgICAgIGluZm8gPSBiaW5kaW5nTGFuZ3VhZ2UuaW5zcGVjdEF0dHJpYnV0ZShyZXNvdXJjZXMsIGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgICAgdHlwZSA9IHJlc291cmNlcy5nZXRBdHRyaWJ1dGUoaW5mby5hdHRyTmFtZSk7XG4gICAgICBlbGVtZW50UHJvcGVydHkgPSBudWxsO1xuXG4gICAgICBpZih0eXBlKXsgLy9kbyB3ZSBoYXZlIGFuIGF0dGFjaGVkIGJlaGF2aW9yP1xuICAgICAgICBrbm93bkF0dHJpYnV0ZSA9IHJlc291cmNlcy5tYXBBdHRyaWJ1dGUoaW5mby5hdHRyTmFtZSk7IC8vbWFwIHRoZSBsb2NhbCBuYW1lIHRvIHJlYWwgbmFtZVxuICAgICAgICBpZihrbm93bkF0dHJpYnV0ZSl7XG4gICAgICAgICAgcHJvcGVydHkgPSB0eXBlLmF0dHJpYnV0ZXNba25vd25BdHRyaWJ1dGVdO1xuXG4gICAgICAgICAgaWYocHJvcGVydHkpeyAvL2lmIHRoZXJlJ3MgYSBkZWZpbmVkIHByb3BlcnR5XG4gICAgICAgICAgICBpbmZvLmRlZmF1bHRCaW5kaW5nTW9kZSA9IHByb3BlcnR5LmRlZmF1bHRCaW5kaW5nTW9kZTsgLy9zZXQgdGhlIGRlZmF1bHQgYmluZGluZyBtb2RlXG5cbiAgICAgICAgICAgIGlmKCFpbmZvLmNvbW1hbmQgJiYgIWluZm8uZXhwcmVzc2lvbil7IC8vIGlmIHRoZXJlIGlzIG5vIGNvbW1hbmQgb3IgZGV0ZWN0ZWQgZXhwcmVzc2lvblxuICAgICAgICAgICAgICBpbmZvLmNvbW1hbmQgPSBwcm9wZXJ0eS5oYXNPcHRpb25zID8gJ29wdGlvbnMnIDogbnVsbDsgLy9hbmQgaXQgaXMgYW4gb3B0b25zIHByb3BlcnR5LCBzZXQgdGhlIG9wdGlvbnMgY29tbWFuZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfWVsc2UgaWYoZWxlbWVudEluc3RydWN0aW9uKXsgLy9vciBpZiB0aGlzIGlzIG9uIGEgY3VzdG9tIGVsZW1lbnRcbiAgICAgICAgZWxlbWVudFByb3BlcnR5ID0gZWxlbWVudEluc3RydWN0aW9uLnR5cGUuYXR0cmlidXRlc1tpbmZvLmF0dHJOYW1lXTtcbiAgICAgICAgaWYoZWxlbWVudFByb3BlcnR5KXsgLy9hbmQgdGhpcyBhdHRyaWJ1dGUgaXMgYSBjdXN0b20gcHJvcGVydHlcbiAgICAgICAgICBpbmZvLmRlZmF1bHRCaW5kaW5nTW9kZSA9IGVsZW1lbnRQcm9wZXJ0eS5kZWZhdWx0QmluZGluZ01vZGU7IC8vc2V0IHRoZSBkZWZhdWx0IGJpbmRpbmcgbW9kZVxuXG4gICAgICAgICAgaWYoIWluZm8uY29tbWFuZCAmJiAhaW5mby5leHByZXNzaW9uKXsgLy8gaWYgdGhlcmUgaXMgbm8gY29tbWFuZCBvciBkZXRlY3RlZCBleHByZXNzaW9uXG4gICAgICAgICAgICBpbmZvLmNvbW1hbmQgPSBlbGVtZW50UHJvcGVydHkuaGFzT3B0aW9ucyA/ICdvcHRpb25zJyA6IG51bGw7IC8vYW5kIGl0IGlzIGFuIG9wdG9ucyBwcm9wZXJ0eSwgc2V0IHRoZSBvcHRpb25zIGNvbW1hbmRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYoZWxlbWVudFByb3BlcnR5KXtcbiAgICAgICAgaW5zdHJ1Y3Rpb24gPSBiaW5kaW5nTGFuZ3VhZ2UuY3JlYXRlQXR0cmlidXRlSW5zdHJ1Y3Rpb24ocmVzb3VyY2VzLCBub2RlLCBpbmZvLCBlbGVtZW50SW5zdHJ1Y3Rpb24pO1xuICAgICAgfWVsc2V7XG4gICAgICAgIGluc3RydWN0aW9uID0gYmluZGluZ0xhbmd1YWdlLmNyZWF0ZUF0dHJpYnV0ZUluc3RydWN0aW9uKHJlc291cmNlcywgbm9kZSwgaW5mbyk7XG4gICAgICB9XG5cbiAgICAgIGlmKGluc3RydWN0aW9uKXsgLy9IQVMgQklORElOR1NcbiAgICAgICAgaWYoaW5zdHJ1Y3Rpb24uYWx0ZXJlZEF0dHIpe1xuICAgICAgICAgIHR5cGUgPSByZXNvdXJjZXMuZ2V0QXR0cmlidXRlKGluc3RydWN0aW9uLmF0dHJOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGluc3RydWN0aW9uLmRpc2NyZXRlKXsgLy9yZWYgYmluZGluZyBvciBsaXN0ZW5lciBiaW5kaW5nXG4gICAgICAgICAgZXhwcmVzc2lvbnMucHVzaChpbnN0cnVjdGlvbik7XG4gICAgICAgIH1lbHNleyAvL2F0dHJpYnV0ZSBiaW5kaW5nc1xuICAgICAgICAgIGlmKHR5cGUpeyAvL3RlbXBsYXRvciBvciBhdHRhY2hlZCBiZWhhdmlvciBmb3VuZFxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb24udHlwZSA9IHR5cGU7XG4gICAgICAgICAgICBjb25maWd1cmVQcm9wZXJ0aWVzKGluc3RydWN0aW9uLCByZXNvdXJjZXMpO1xuXG4gICAgICAgICAgICBpZih0eXBlLmxpZnRzQ29udGVudCl7IC8vdGVtcGxhdGUgY29udHJvbGxlclxuICAgICAgICAgICAgICBpbnN0cnVjdGlvbi5vcmlnaW5hbEF0dHJOYW1lID0gYXR0ck5hbWU7XG4gICAgICAgICAgICAgIGxpZnRpbmdJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1lbHNleyAvL2F0dGFjaGVkIGJlaGF2aW9yXG4gICAgICAgICAgICAgIGJlaGF2aW9ySW5zdHJ1Y3Rpb25zLnB1c2goaW5zdHJ1Y3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1lbHNlIGlmKGVsZW1lbnRQcm9wZXJ0eSkgeyAvL2N1c3RvbSBlbGVtZW50IGF0dHJpYnV0ZVxuICAgICAgICAgICAgZWxlbWVudEluc3RydWN0aW9uLmF0dHJpYnV0ZXNbaW5mby5hdHRyTmFtZV0udGFyZ2V0UHJvcGVydHkgPSBlbGVtZW50UHJvcGVydHkubmFtZTtcbiAgICAgICAgICB9IGVsc2V7IC8vc3RhbmRhcmQgYXR0cmlidXRlIGJpbmRpbmdcbiAgICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2goaW5zdHJ1Y3Rpb24uYXR0cmlidXRlc1tpbnN0cnVjdGlvbi5hdHRyTmFtZV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfWVsc2V7IC8vTk8gQklORElOR1NcbiAgICAgICAgaWYodHlwZSl7IC8vdGVtcGxhdG9yIG9yIGF0dGFjaGVkIGJlaGF2aW9yIGZvdW5kXG4gICAgICAgICAgaW5zdHJ1Y3Rpb24gPSB7IGF0dHJOYW1lOmF0dHJOYW1lLCB0eXBlOnR5cGUsIGF0dHJpYnV0ZXM6e30gfTtcbiAgICAgICAgICBpbnN0cnVjdGlvbi5hdHRyaWJ1dGVzW3Jlc291cmNlcy5tYXBBdHRyaWJ1dGUoYXR0ck5hbWUpXSA9IGF0dHJWYWx1ZTtcblxuICAgICAgICAgIGlmKHR5cGUubGlmdHNDb250ZW50KXsgLy90ZW1wbGF0ZSBjb250cm9sbGVyXG4gICAgICAgICAgICBpbnN0cnVjdGlvbi5vcmlnaW5hbEF0dHJOYW1lID0gYXR0ck5hbWU7XG4gICAgICAgICAgICBsaWZ0aW5nSW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1lbHNleyAvL2F0dGFjaGVkIGJlaGF2aW9yXG4gICAgICAgICAgICBiZWhhdmlvckluc3RydWN0aW9ucy5wdXNoKGluc3RydWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1lbHNlIGlmKGVsZW1lbnRQcm9wZXJ0eSl7IC8vY3VzdG9tIGVsZW1lbnQgYXR0cmlidXRlXG4gICAgICAgICAgZWxlbWVudEluc3RydWN0aW9uLmF0dHJpYnV0ZXNbYXR0ck5hbWVdID0gYXR0clZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9lbHNlOyBub3JtYWwgYXR0cmlidXRlOyBkbyBub3RoaW5nXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYobGlmdGluZ0luc3RydWN0aW9uKXtcbiAgICAgIGxpZnRpbmdJbnN0cnVjdGlvbi52aWV3RmFjdG9yeSA9IHZpZXdGYWN0b3J5O1xuICAgICAgbm9kZSA9IGxpZnRpbmdJbnN0cnVjdGlvbi50eXBlLmNvbXBpbGUodGhpcywgcmVzb3VyY2VzLCBub2RlLCBsaWZ0aW5nSW5zdHJ1Y3Rpb24sIHBhcmVudE5vZGUpO1xuICAgICAgbWFrZUludG9JbnN0cnVjdGlvblRhcmdldChub2RlKTtcbiAgICAgIGluc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgYW5jaG9ySXNDb250YWluZXI6IGZhbHNlLFxuICAgICAgICBwYXJlbnRJbmplY3RvcklkOiBwYXJlbnRJbmplY3RvcklkLFxuICAgICAgICBleHByZXNzaW9uczogW10sXG4gICAgICAgIGJlaGF2aW9ySW5zdHJ1Y3Rpb25zOiBbbGlmdGluZ0luc3RydWN0aW9uXSxcbiAgICAgICAgdmlld0ZhY3Rvcnk6IGxpZnRpbmdJbnN0cnVjdGlvbi52aWV3RmFjdG9yeSxcbiAgICAgICAgcHJvdmlkZXJzOiBbbGlmdGluZ0luc3RydWN0aW9uLnR5cGUudGFyZ2V0XVxuICAgICAgfSk7XG4gICAgfWVsc2V7XG4gICAgICBmb3IoaSA9IDAsIGlpID0gYmVoYXZpb3JJbnN0cnVjdGlvbnMubGVuZ3RoOyBpIDwgaWk7ICsraSl7XG4gICAgICAgIGluc3RydWN0aW9uID0gYmVoYXZpb3JJbnN0cnVjdGlvbnNbaV07XG4gICAgICAgIGluc3RydWN0aW9uLnR5cGUuY29tcGlsZSh0aGlzLCByZXNvdXJjZXMsIG5vZGUsIGluc3RydWN0aW9uLCBwYXJlbnROb2RlKTtcbiAgICAgICAgcHJvdmlkZXJzLnB1c2goaW5zdHJ1Y3Rpb24udHlwZS50YXJnZXQpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5qZWN0b3JJZCA9IGJlaGF2aW9ySW5zdHJ1Y3Rpb25zLmxlbmd0aCA/IGdldE5leHRJbmplY3RvcklkKCkgOiBmYWxzZTtcblxuICAgICAgaWYoZXhwcmVzc2lvbnMubGVuZ3RoIHx8IGJlaGF2aW9ySW5zdHJ1Y3Rpb25zLmxlbmd0aCl7XG4gICAgICAgIG1ha2VJbnRvSW5zdHJ1Y3Rpb25UYXJnZXQobm9kZSk7XG4gICAgICAgIGluc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICBhbmNob3JJc0NvbnRhaW5lcjogZWxlbWVudEluc3RydWN0aW9uID8gZWxlbWVudEluc3RydWN0aW9uLmFuY2hvcklzQ29udGFpbmVyIDogdHJ1ZSxcbiAgICAgICAgICBpc0N1c3RvbUVsZW1lbnQ6ICEhZWxlbWVudEluc3RydWN0aW9uLFxuICAgICAgICAgIGluamVjdG9ySWQ6IGluamVjdG9ySWQsXG4gICAgICAgICAgcGFyZW50SW5qZWN0b3JJZDogcGFyZW50SW5qZWN0b3JJZCxcbiAgICAgICAgICBleHByZXNzaW9uczogZXhwcmVzc2lvbnMsXG4gICAgICAgICAgYmVoYXZpb3JJbnN0cnVjdGlvbnM6IGJlaGF2aW9ySW5zdHJ1Y3Rpb25zLFxuICAgICAgICAgIHByb3ZpZGVyczogcHJvdmlkZXJzXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZihlbGVtZW50SW5zdHJ1Y3Rpb24gJiYgZWxlbWVudEluc3RydWN0aW9uLnR5cGUuc2tpcENvbnRlbnRQcm9jZXNzaW5nKXtcbiAgICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIHZhciBjdXJyZW50Q2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICB3aGlsZSAoY3VycmVudENoaWxkKSB7XG4gICAgICAgIGN1cnJlbnRDaGlsZCA9IHRoaXMuY29tcGlsZU5vZGUoY3VycmVudENoaWxkLCByZXNvdXJjZXMsIGluc3RydWN0aW9ucywgbm9kZSwgaW5qZWN0b3JJZCB8fCBwYXJlbnRJbmplY3RvcklkLCB0YXJnZXRMaWdodERPTSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG4gIH1cbn1cbiJdfQ== |